Skip to content

属性名的遍历 ​

本节目标:理解“属性名的遍历”的核心思路,并能把它用于实际开发或面试表达。

Object.getOwnPropertySymbols()方法,可以获取指定对象的所有Symbol 属性名。
返回值:返回一个数组,成员是当前对象的所有用作属性名的Symbol值。
const obj = {};let a = Symbol('a');let b = Symbol('b');
obj[a] = 'Hello';obj[b] = 'World';
const objectSymbols = Object.getOwnPropertySymbols(obj);
objectSymbols// [Symbol(a), Symbol(b)]
Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
let obj = {  [Symbol('my_key')]: 1,  enum: 2,  nonEnum: 3};
Reflect.ownKeys(obj)//  ["enum", "nonEnum", Symbol(my_key)]
**伪私有属性**
由于以 Symbol 值作为键名,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。
let size = Symbol('size');
class Collection {  constructor() {    this[size] = 0;  }
add(item) {    this[this[size]] = item;    this[size]++;  }
static sizeOf(instance) {    return instance[size];  }}
let x = new Collection();Collection.sizeOf(x) // 0
x.add('foo');Collection.sizeOf(x) // 1
Object.keys(x) // ['0']Object.getOwnPropertyNames(x) // ['0']Object.getOwnPropertySymbols(x) // [Symbol(size)]
上面代码中,对象x的size属性是一个 Symbol 值,所以Object.keys(x)、Object.getOwnPropertyNames(x)都无法获取它。这就造成了一种非私有的内部方法的效果。

本站总访问 — 次